#!/bin/bash
# скрипт создания гибридного liveiso
# зависимости: archiso-git, gzip, coreutils
# еще нужно подготовить конфиги и оверлей

#set -e -u

# переменные которые можно переопределить в конфиге $PWD/config.cfg
CONFDIR="${PWD}/config"
OVERLAY="${CONFDIR}/overlay"
PACMAN_CONF="${CONFDIR}/pacman.conf"
# файл с паролями для live-пользователя и пароль для рута
PASSWORDS="${CONFDIR}/defaults.pswd"
NEEDPKG="base cpio dnsutils fuse syslinux memtest86+"
INSTALL_DIR="arch"
ARCH="i686"
INITCPIO="${CONFDIR}/mkinitcpio.conf"
# для коммерческий драйверов видеокарт установки производится с опцией --nodeps 
# следует указывать все требуемые компоненты следует иметь в виду, что nouveau конфликтует с nvidia
# в rc.conf залочил драйвер опцией !nouveau. может лучше в blacklist?
COMMDRIVERS="extra/nvidia extra/nvidia-utils extra/nvidia-173xx extra/nvidia-173xx-utils extra/nvidia-96xx extra/nvidia-96xx-utils catalyst/catalyst catalyst/catalyst-utils"
FREEDRIVERS="libgl ati-dri xf86-video-ati xf86-video-nv"
VERBOSE="-v"
UNINSTPKG="base-devel kernel26-headers"
CLEAN_INCLUDE="no"
COMPRESSION="gzip"
CLEANCACHE="no"
CLEANWORKDIR="yes"
ISO_LABEL="OpenArch"
TIMEZONE='Europe/Moscow'
CLOCK="localtime"
_PRESET="openarch"
ALL_kver="$(uname -r)"

## эти переменные можно переопределить в $CONFDIR/defaults.pswd
## даже если файла нет дефолтные значения следующие
#LIVE_USER="liveuser"
#ROOT_PASSWD="root"
#LIVE_USER="liveuser"
#LIVE_PASSWD="liveuser"

## USAGE
if [ "x${1}" = "x-h" -o "x${1}" = "x--help" ]; then
  echo "Скрипт для подготовки гибридного образа OpenArch."
  echo "Может быть использован и для Arch Linux"
  echo "Использование:"
  echo "$0 [workdir]"
  echo "Workdir  - рабочая директория."
  echo "Если workdir не занадо, используется ./workdir."
    exit 0
fi

# IS ROOT?
if [ "${EUID}" != "0" ]; then
    error "error: This script must be run as root."
    exit 1
fi


#####################
#    FUNCTIONS      #
#####################

error () { echo -e "\033[1;31;40m!!! \033[1;37;40m$@\033[1;0m"; }
warn ()  { echo -e "\033[1;33;40m*** \033[1;37;40m$@\033[1;0m"; }
info () { echo -e "\033[1;32;40m>>> \033[1;37;40m$@\033[1;0m"; }

die() {
[[ "$1" == "0" ]] && info "${2}" || error "${2}"
exit $1
}

get_kernver() {
    local kernver= kernel=$1

    if [[ -z $kernel ]]; then
        uname -r
        return 0
    fi

    if [[ ${kernel:0:1} != / ]]; then
        echo "$kernel"
        return 0
    fi

    if [[ ! -e ${WORKDIR}/root-image/$kernel ]]; then
        error "Specified kernel image does not exist: \`%s'" "${WORKDIR}/root-image/$kernel"
        return 1
    fi

    read _ kernver < <(file -b "$WORKDIR$kernel" | grep -o 'version [^ ]\+')
    if [[ $kernver && -e ${WORKDIR}/root-image/lib/modules/$kernver ]]; then
        echo "$kernver"
        return 0
    fi

    [[ ${optkver:0:1} == / ]] && optkver=${WORKDIR}/root-image/$optkver
    error "invalid kernel specifier: \`%s'" "$optkver"

    return 1
}

prepareconfig() {
# переопределим переменные из конфигурационного файла $PWD/config
[[ -r "${PWD}/config.cfg" ]] && source "${PWD}/config.cfg" || warn 'Файл конфигурции не найден!'

# переменные, которые нельзя переопределить в конфиге
[[ $(readlink -f -s "$1") ]] && WORKDIR="$(readlink -f -s $1)" || WORKDIR="${PWD}/work"

[[ -z ${ARCH} ]] && ARCH="$(uname -m)"
PKGS="$(grep -v ^# "${CONFDIR}/packages.${ARCH}" | grep .)"

RET=""

[ -z ${VERBOSE} -o "${VERBOSE}" = "no" -o "${VERBOSE}" = "NO" -o "${VERBOSE}" = "off" -o "${VERBOSE}" = "OFF" ] && \
 VERBOSE="" || VERBOSE="-v"
}

prepare() {
if [[ ! -e "${WORKDIR}"/build.${FUNCNAME} ]]; then
  # настроим переменные
  prepareconfig

  # очистка рабочей директории
  if [[ "${CLEANWORKDIR}" == "yes" ]]; then
    warn 'Очистка рабочей директории!'
    rm -rf "${WORKDIR}"
  fi

  # создадим рабочюю директорию
  #mkdir -p ${VERBOSE} "${WORKDIR}"  || die 1 "Ошибка создания рабочей директории!"
  mkarchiso ${VERBOSE} -w "${WORKDIR}" -C "${PACMAN_CONF}" -D "${INSTALL_DIR}" init || \
    die "${$?}" 'Ошибка инициализации'

  mknod "${WORKDIR}/test" c 1 3 1>&2 2>/dev/null || \
  (warn "Невозможно создать устройство в ${WORKDIR}. Возможны ошибки!"
    info "Попробуйте выбрать другую рабочую директорию.")
    rm -f "${WORKDIR}/test" 1>&2 2>/dev/null


  #для избежания конфликтов с пакетами их кэша системы следует этот кэш почистить
  if [[ "${CLEANCACHE}" = 'yes' ]]; then
      info "Производится очистка кэша..."
      yes "Yes" | pacman -Scc
      rm -rf "${PWD}/cachedir"
  fi

  # установим сначала базовый набор пакетов, а затем все по списку из профиля
  warn "Производится установка пакетов по-умолчанию..."

  ## подготовим пакеты для установки в mkarchiso
  #local P=""
  #for i in ${NEEDPKG}; do  P+="-p ${i} "; done
  
  mkarchiso ${VERBOSE} -D "${INSTALL_DIR}" -C "${PACMAN_CONF}" -w "${WORKDIR}" -p "${NEEDPKG}" install || \
    die "${$?}" 'Ошибка установки пакетов по-умолчанию!' 

  : > "${WORKDIR}"/build.${FUNCNAME}
fi # if [[ ! -e ${WORKDIR}/build.${FUNCNAME} ]]; then
}

packages() {
if [[ ! -e "${WORKDIR}"/build.${FUNCNAME} ]]; then
  # сначала подготовка
  prepare

  ## подготовим пакеты для установки в mkarchiso
  #local P=""
  #for i in ${PKG}; do  P+="-p ${i} "; done
  
  mkdir -p "${PWD}/cachedir"
  warn "Производится установка пакетов по списку..."
  pacman --config "${PACMAN_CONF}" --root "${WORKDIR}/root-image" --dbpath "${WORKDIR}/root-image/var/lib/pacman" \
    --noconfirm --cachedir "${PWD}/cachedir" \
        -S ${PKGS} || die "${$?}" 'Ошибка установки пакетов!'
  #mkarchiso ${VERBOSE} -D ${INSTALL_DIR} -C "${PACMAN_CONF}" -p "${PKGS}" -w "${WORKDIR}" install  || \
  #  die "${$?}" 'Ошибка установки пакетов!'

  : > "${WORKDIR}"/build.${FUNCNAME}
fi # if [[ ! -e ${WORKDIR}/build.${FUNCNAME} ]]; then
}

create_users() {
  if [[ -r "${PASSWORDS}" ]]; then 
    source "${PASSWORDS}"
  else  # if [[ -r "${PASSWORDS}" ]]; then 
    error 'Отсутсвует файл с настройками пользовалей defaults.pswd!'
    info 'Будут использованы настройки по-умолчанию'
  fi

  # создадим дефолтного пользователя
  warn 'Создадим live-пользователя'
  _SHELL='/bin/sh'
    [[ -x ${WORKDIR}/root-image/bin/bash ]] && _SHELL="/bin/bash"
    [[ -x ${WORKDIR}/root-image/bin/zsh ]] && _SHELL="/bin/zsh"
  _SKELL="/etc/skel"
  [[ -d "${WORKDIR}/root-image/etc/skel_openarch/" ]] && \
    _SKELL=/etc/skel_openarch
  [[ ${DEFAULT_GROUPS} ]] || DEFAULT_GROUPS="audio,optical,floppy,video,power"

  ## перенесем файл с паролями
  #mkdir ${VERBOSE} -p "${WORKDIR}/root-image/etc/defaults/"
  #install ${VERBOSE} "${PASSWORDS}" "${WORKDIR}/root-image/etc/defaults/"
  #добавим в issue запись о логине и пароле
  # проверим переменные из файла ${PASSWORDS}
  [[ ${LIVE_USER} ]] || LIVE_USER="liveuser"
  cat "${CONFDIR}/issue" | sed -e "s|@@LIVE_USER@@|${LIVE_USER}|g" > \
    "${WORKDIR}/root-image/etc/issue"

  ## пароли
  # liveuser
  if [[ -n ${LIVE_PASSWD} ]]; then
    chroot "${WORKDIR}"/root-image \
      /usr/sbin/useradd -g users -G ${DEFAULT_GROUPS} -m -s ${_SHELL} -k ${_SKELL} ${LIVE_USER}
    _USER="${LIVE_USER}"
    _PASS="${LIVE_PASSWD}"
    cat > "${WORKDIR}"/root-image/tmp/pass.sh<<EOF
#!/bin/sh
/bin/echo ${_USER}:${_PASS} | /usr/sbin/chpasswd
EOF
  chmod +x "${WORKDIR}"/root-image/tmp/pass.sh
  chroot "${WORKDIR}"/root-image  /tmp/pass.sh
  sed -i "s|@@LIVE_PASSWD@@|/${LIVE_PASSWD}|g" \
    "${WORKDIR}/root-image/etc/issue"
  else
    chroot "${WORKDIR}"/root-image \
      /usr/sbin/useradd -g users -G ${DEFAULT_GROUPS} -m -s ${_SHELL} -k ${_SKELL} -p "" ${LIVE_USER}
    sed -i "s|@@LIVE_PASSWD@@||g" \
        "${WORKDIR}/root-image/etc/issue"
  fi

  # root
  if [[ ${ROOT_PASSWD} ]]; then
    _USER="root"
    _PASS="${ROOT_PASSWD}"
    cat > "${WORKDIR}"/root-image/tmp/pass.sh<<EOF
#!/bin/sh
/bin/echo ${_USER}:${_PASS} | /usr/sbin/chpasswd
EOF
  chmod +x "${WORKDIR}"/root-image/tmp/pass.sh
  chroot "${WORKDIR}"/root-image  /tmp/pass.sh
    sed -i "s|@@ROOT_PASSWD@@|/${ROOT_PASSWD}|g" \
        "${WORKDIR}/root-image/etc/issue"
  else
    chroot "${WORKDIR}"/root-image /usr/sbin/usermod -p '' root
    sed -i "s|@@ROOT_PASSWD@@||g" \
        "${WORKDIR}/root-image/etc/issue"
    ## for useing su with no passwd
    #install "${CONFDIR}"/su_nopasswd "${WORKDIR}"/root-image/etc/pam.d/su
  fi

 rm -f "${WORKDIR}"/root-image/tmp/pass.sh
}

# do not use NOW
make_overlay() {
if [[ ! -e "${WORKDIR}"/build.${FUNCNAME} ]]; then
    warn 'Overlay for merging'
    cp ${VERBOSE} -R "${OVERLAY}" "${WORKDIR}"
fi # if [[ ! -e "${WORKDIR}"/build.${FUNCNAME} ]]; then
}

customize_root-image() {
if [[ ! -e "${WORKDIR}"/build.${FUNCNAME} ]]; then
  # сначала должны быть уставлены все пакеты
  packages

  ## подготовим overlay
  warn 'Подготовка overlay...'
  cp ${VERBOSE} -Rf "${OVERLAY}"/* "${WORKDIR}/root-image/"

  create_users

  # slim config prepare
  cat "${CONFDIR}/slim.conf" |  sed -e "s|@@LIVE_USER@@|${LIVE_USER}|g" \
    > "${WORKDIR}/root-image/etc/slim.conf"

  # подготовим mirrorlist
  #[[ ${VERBOSE} == "-v" ]] && \
  #  wget 'http://www.archlinux.org/mirrorlist/all/' -O "${WORKDIR}/root-image/etc/pacman.d/mirrorlist" || \
  #  wget 'http://www.archlinux.org/mirrorlist/all/' -O "${WORKDIR}/root-image/etc/pacman.d/mirrorlist" &>/dev/null
  # sed -i 's/#Server/Server/g' "${WORKDIR}/root-image/etc/pacman.d/mirrorlist"

  install -d -m755 "${WORKDIR}/root-image/etc/pacman.d"
  install -m644 /etc/pacman.d/mirrorlist "${WORKDIR}/root-image/etc/pacman.d/mirrorlist"

  # права на sudoers
  chmod 0440 ${WORKDIR}/root-image/etc/sudoers
  chmod 750 ${WORKDIR}/root-image/etc/sudoers.d
  chmod 440 ${WORKDIR}/root-image/etc/sudoers.d/*

  # locale-gen
  warn 'Подготовим локализацию'
  #echo -e 'en_US.UTF-8 UTF-8\nru_RU.UTF-8 UTF-8\n' > "${WORKDIR}/root-image/etc/locale.gen"
  sed -e 's|^#||g' "${CONFDIR}"/locale.gen > "${WORKDIR}"/root-image/etc/locale.gen
  chroot  "${WORKDIR}/root-image" /usr/sbin/locale-gen

  # удалим *.pacnew
  find "${WORKDIR}"/root-image/etc -type f -name *.pacnew -exec rm -f ${VERBOSE} '{}' \;

  # добавим информацию о релизе
  echo "OpenArch Linux Live ISO `date +%d.%m.%Y`" > "${WORKDIR}"/root-image/etc/arch-release

  # поправим вывод информации о дистрибутиве
  cp "${WORKDIR}"/root-image/etc/rc.sysinit "${PWD}/"
  patch -p0 -i "${CONFDIR}"/rc.sysinit.diff 
  install -D -m755 "${PWD}"/rc.sysinit "${WORKDIR}"/root-image/etc/rc.sysinit
  rm "${PWD}"/rc.sysinit

  #timezone
  cp "${VERBOSE}" "${WORKDIR}/root-image/usr/share/zoneinfo/${TIMEZONE}" "${WORKDIR}/root-image/etc/localtime"
  sed -e "s|@@TIMEZONE@@|${TIMEZONE}|g;s|@@CLOCK@@|${CLOCK}|g" "${CONFDIR}"/rc.conf > "${WORKDIR}"/root-image/etc/rc.conf

  : > "${WORKDIR}"/build.${FUNCNAME}
fi # if [[ ! -e ${WORKDIR}/build.${FUNCNAME} ]]; then
}

setup_mkinitcpio() {
if [[ ! -e "${WORKDIR}"/build.${FUNCNAME} ]]; then

  warn 'Подготовка initrd...'
  mkdir ${VERBOSE} -p ${WORKDIR}/iso/${INSTALL_DIR}
  [[ ! -r ${INITCPIO} ]] && \
    die 'Конфигурационный файл mkinitcpio не найден!'
  cp "${INITCPIO}" "${WORKDIR}"/root-image/etc/mkinitcpio-archiso.conf
  sed -i "s/^COMPRESSION=.*/COMPRESSION=${COMPRESSION}/g" \
    "${WORKDIR}"/root-image/etc/mkinitcpio-archiso.conf

  local _hook
  for _hook in archiso archiso_shutdown archiso_pxe_common \
        archiso_pxe_nbd archiso_pxe_http archiso_pxe_nfs archiso_loop_mnt; do
    cp /usr/lib/initcpio/hooks/${_hook} "${WORKDIR}"/root-image/usr/lib/initcpio/hooks
    cp /usr/lib/initcpio/install/${_hook} "${WORKDIR}"/root-image/usr/lib/initcpio/install
  done
  cp -f /usr/lib/initcpio/install/archiso_kms "${WORKDIR}"/root-image/usr/lib/initcpio/install
  cp -f /usr/lib/initcpio/archiso_shutdown "${WORKDIR}"/root-image/usr/lib/initcpio
  cp -f /usr/lib/initcpio/archiso_pxe_nbd "${WORKDIR}"/root-image/usr/lib/initcpio
  ## myconsolefont 
  #cp -f ${VERBOSE} "${CONFDIR}"/myconsolefont "${WORKDIR}"/root-image/usr/lib/initcpio/install/
  mkarchiso ${VERBOSE} -w "${WORKDIR}" -D "${INSTALLDIR}" \
    -r 'mkinitcpio -c /etc/mkinitcpio-archiso.conf -k /boot/vmlinuz-linux -g /boot/archiso.img' \
        run
  mv ${VERBOSE} ${WORKDIR}/root-image/boot/archiso.img "${WORKDIR}"/iso/${INSTALL_DIR}/archiso.img || \
    die "${RET}" 'Ошибка подготовки archiso.img!'

  : > "${WORKDIR}"/build.${FUNCNAME}
fi # if [[ ! -e ${WORKDIR}/build.${FUNCNAME} ]]; then
}

make_boot() {
if [[ ! -e ${WORKDIR}/build.${FUNCNAME} ]]; then
    # presets
#  if [[ `ls "${WORKDIR}"/root-image/etc/mkinitcpio.d/linux*.preset` ]]; then
#    [[ "${WORKDIR}"/root-image/etc/mkinitcpio.d/linux-pae.preset ]] _PRESET="${WORKDIR}"/root-image/etc/mkinitcpio.d/linux-pae
#    [[ "${WORKDIR}"/root-image/etc/mkinitcpio.d/linux-lts.preset ]] _PRESET="${WORKDIR}"/root-image/etc/mkinitcpio.d/linux-lts
#    [[ "${WORKDIR}"/root-image/etc/mkinitcpio.d/linux.preset ]] _PRESET="${WORKDIR}"/root-image/etc/mkinitcpio.d/linux
#  fi
#  if [[ -z ${_PRESET} ]]; then
#    error 'Не удалось определить версию ядра устанавливаемой системы!'
#    info 'Будет использовано значение из host системы.'
#    ALL_kver="$(uname -r)"
#  fi



  # preset
  install -dm755 "${WORKDIR}/root-image/etc/mkinitcpio.d/"
  install ${VERBOSE} -m644 "${CONFDIR}/openarch.preset" "${WORKDIR}/root-image/etc/mkinitcpio.d/"
  # do not load automatically nouveau
  install -dm755 "${WORKDIR}"/root-image/etc/modprobe.d/
  install ${VERBOSE} -m644 "${OVERLAY}"/etc/modprobe.d/nouveau_blacklist.conf "${WORKDIR}"/root-image/etc/modprobe.d/

  # ядро
  warn 'Подготовка загрузчика...'
  mkdir ${VERBOSE} -p "${WORKDIR}"/iso/${INSTALL_DIR}
#  cp ${VERBOSE} "${WORKDIR}/root-image/boot/System.map26" "${WORKDIR}/iso/${INSTALL_DIR}/" || RET="1"
  cp ${VERBOSE} "${WORKDIR}/root-image/boot/vmlinuz-linux" "${WORKDIR}/iso/${INSTALL_DIR}/vmlinuz26" || \
       die "${RET}" "Ошибка подготовки ядра!"

  # memtest86
  cp ${VERBOSE} "${WORKDIR}/root-image/boot/memtest86+/memtest.bin" "${WORKDIR}/iso/${INSTALL_DIR}/memtest"  || RET="1"
  cp ${VERBOSE} "${WORKDIR}/root-image/usr/share/licenses/common/GPL2/license.txt" "${WORKDIR}/iso/${INSTALL_DIR}/memtest.COPYING" || RET="1"
  
  (( $RET )) && \
    die "${RET}" 'Ошибка установки memtest86!'

  # подготовимся к сборке initrd
  setup_mkinitcpio

  : > "${WORKDIR}"/build.${FUNCNAME}
fi # if [[ ! -e ${work_dir}/build.${FUNCNAME} ]]; then
}

# Prepare /${install_dir}/boot/syslinux
make_syslinux() {
if [[ ! -e "${WORKDIR}"/build.${FUNCNAME} ]]; then

  # syslinux
  mkdir -p ${VERBOSE} "${WORKDIR}"/iso/${INSTALL_DIR}/syslinux/ || RET='1'
  cp ${VERBOSE} "${WORKDIR}"/root-image/usr/lib/syslinux/*.c32 "${WORKDIR}"/iso/${INSTALL_DIR}/syslinux/  || RET="1"
  cp ${VERBOSE} "${WORKDIR}"/root-image/usr/lib/syslinux/memdisk "${WORKDIR}"/iso/${INSTALL_DIR}/syslinux/  || RET="1"
  cp ${VERBOSE} "${WORKDIR}"/root-image/usr/lib/syslinux/*.com "${WORKDIR}"/iso/${INSTALL_DIR}/syslinux/  || RET="1"
  cp ${VERBOSE} -r "${CONFDIR}"/boot-files/* "${WORKDIR}"/iso/${INSTALL_DIR}/  || RET="1"
  sed "s|@ARCHISO_LABEL@|${ISO_LABEL}|g;
        s|@INSTALL_DIR@|${INSTALL_DIR}|g;
        s|@ARCH@|${ARCH}|g" \
    "${CONFDIR}"/syslinux/syslinux.cfg > \
    "${WORKDIR}/iso/${INSTALL_DIR}/syslinux/syslinux.cfg" || RET=1

#  # PXE загрузка
#  cp ${VERBOSE} "${WORKDIR}/root-image/usr/lib/syslinux/pxelinux.0" "${WORKDIR}/iso/isolinux/" || RET="1"
#  cp ${VERBOSE} "${WORKDIR}/root-image/usr/lib/syslinux/pxelinuxk.0" "${WORKDIR}/iso/isolinux/" || RET="1"
#  cp ${VERBOSE} "${WORKDIR}/root-image/usr/lib/syslinux/gpxelinux.0" "${WORKDIR}/iso/isolinux/" || RET="1"

 [[ ${RET} == '1' ]] && die "${RET}" "Ошибка установки загрузчика!"


  # Add pci.ids and modules.alias for hdt and hwd
  mkdir ${VERBOSE} -p "${WORKDIR}/iso/${INSTALL_DIR}/syslinux/hdt/" 
  mkdir ${VERBOSE} -p "${WORKDIR}"/root-image/usr/share/hwdata 

  if [[ ${VERBOSE} == "-v" ]]; then
    wget 'http://pciids.sourceforge.net/v2.2/pci.ids' -O "${WORKDIR}"/root-image/usr/share/hwdata/pci.ids
  else
    wget 'http://pciids.sourceforge.net/v2.2/pci.ids' -O "${WORKDIR}"/root-image/usr/share/hwdata/pci.ids &>/dev/null
  fi
  
  gzip -c -9 "${WORKDIR}"/root-image/usr/share/hwdata/pci.ids > "${WORKDIR}/iso/${INSTALL_DIR}/syslinux/hdt/pciids.gz" || RET="1"

  gzip -c -9 "${WORKDIR}"/root-image/lib/modules/*-ARCH/modules.alias > "${WORKDIR}/iso/${INSTALL_DIR}/syslinux/hdt/modalias.gz" || RET='1'

   [[ ${RET} == '1' ]] &&  die "${RET}" 'Ошибка установки pci.ids и modules.alias для hdt!'

  : > "${WORKDIR}"/build.${FUNCNAME}

fi # if [[ ! -e ${WORKDIR}/build.${FUNCNAME} ]]; then
}

# Prepare /isolinux
make_isolinux() {
if [[ ! -e "${WORKDIR}"/build.${FUNCNAME} ]]; then
  mkdir -p "${WORKDIR}"/iso/isolinux
  sed "s|%INSTALL_DIR%|${INSTALL_DIR}|g" "${CONFDIR}"/isolinux/isolinux.cfg > "${WORKDIR}"/iso/isolinux/isolinux.cfg || RET='1'
  cp "${WORKDIR}"/root-image/usr/lib/syslinux/isolinux.bin "${WORKDIR}"/iso/isolinux/ || RET="1"
  cp "${WORKDIR}"/root-image/usr/lib/syslinux/isohdpfx.bin "${WORKDIR}"/iso/isolinux/ || RET="1"
  
  [[ ${RET} == '1' ]] && die "${RET}" "Ошибка установки загрузчика!"

  : > "${WORKDIR}"/build.${FUNCNAME}
fi
}


# подготовим aitab
make_aitab() {
if [[ ! -e "${WORKDIR}"/build.${FUNCNAME} ]]; then
  sed "s|@ARCH@|${ARCH}|g" "${CONFDIR}/aitab" > ${WORKDIR}/iso/${INSTALL_DIR}/aitab || \
   die "${?}" "${CONFDIR}/aitab"
  : > "${WORKDIR}"/build.${FUNCNAME}
fi # if [[ ! -e "${WORKDIR}"/build.${FUNCNAME} ]]; then
}

xorg_drivers() {
if [[ ! -e "${WORKDIR}"/build.${FUNCNAME} ]]; then

  # для актуализации требуется также обновить базу
  # скачивание пропреитарных пакетов
  warn 'Подготовка пропреитарных драйверов видеокарт...'
  if [[ -n ${COMMDRIVERS} ]]; then
    mkdir -p "${VERBOSE}" "${WORKDIR}"/root-image/opt/openarch/pkgs/orig
    if [[ "${VERBOSE}" = "-v" ]]; then
      pacman --root "${WORKDIR}/root-image/" --dbpath "${WORKDIR}/root-image/var/lib/pacman" \
          --nodeps --config ${PACMAN_CONF} --noconfirm --cachedir "${WORKDIR}"/root-image/opt/openarch/pkgs \
          -Syw ${COMMDRIVERS}  || \
       die 1 "Не удалось скачать некоторые пропреитарные компоненты."
    else
      pacman --root "${WORKDIR}/root-image/" --dbpath "${WORKDIR}/root-image/var/lib/pacman" \
          --nodeps  --config ${PACMAN_CONF} --noconfirm --cachedir  "${WORKDIR}"/root-image/opt/openarch/pkgs \
          -Syqw ${COMMDRIVERS} || \
       die 1 "Не удалось скачать некоторые пропреитарные компоненты."
    fi
# подготовим откаты для неудачи при установке пропреитарных дров
    if [[ "${VERBOSE}" = "-v" ]]; then
      pacman --root "${WORKDIR}/root-image/" --dbpath "${WORKDIR}/root-image/var/lib/pacman" \
          --nodeps --config ${PACMAN_CONF} --noconfirm --cachedir "${WORKDIR}"/root-image/opt/openarch/pkgs/orig/ \
          -Sw ${FREEDRIVERS} || \
       die 2 "Не удалось скачать некоторые открытые драйверы."
    else
      pacman --root "${WORKDIR}/root-image/" --dbpath "${WORKDIR}/root-image/var/lib/pacman" \
          --nodeps  --config ${PACMAN_CONF} --noconfirm --cachedir  "${WORKDIR}"/root-image/opt/openarch/pkgs/orig/ \
          -Sqw ${FREEDRIVERS} || \
       die 2 "Не удалось скачать некоторые открытые драйверы."
    fi
  fi # if [[ -n ${COMMDRIVERS} ]]; then

  : > "${WORKDIR}"/build.${FUNCNAME}
fi # if [[ ! -e "${WORKDIR}"/build.${FUNCNAME} ]]; then
}


atlast() {
if [[ ! -e "${WORKDIR}"/build.${FUNCNAME} ]]; then
  
  warn "Завершение подготоки образа..."
  ## обновим usb.ids
  #if [[ ${VERBOSE} == "-v" ]]; then
  #  wget 'http://www.linux-usb.org/usb.ids' -O "${WORKDIR}"/root-image/usr/share/hwdata/usb.ids || warn "Ошибка обновления usb.ids"
  #else
  #  wget 'http://www.linux-usb.org/usb.ids' -O "${WORKDIR}"/root-image/usr/share/hwdata/usb.ids &>/dev/null || warn "Ошибка обновления usb.ids"
  #fi

  # удалим ненужные пакеты
  [[ -n "${UNINSTPKG}" ]] && \
    (warn 'Удаляются указаные пакеты...'
     for p in ${UNINSTPKG}; do
    [[ "${VERBOSE}" = "-v" ]] && \
      pacman -Rnsu --noconfirm ${p} --root "${WORKDIR}/root-image/" --dbpath "${WORKDIR}/root-image/var/lib/pacman" || \
      pacman -Rqnsu --noconfirm ${p} --root "${WORKDIR}/root-image/" --dbpath "${WORKDIR}/root-image/var/lib/pacman" 
    done)

  # создадим список пакетов (с номерами версий)
  pacman --dbpath "${WORKDIR}/root-image/var/lib/pacman" --root "${WORKDIR}/root-image" -Q > "${WORKDIR}/iso/packages.${ARCH}.list" 

  # удалим файлы /usr/include/* и /usr/share/doc/*
  if [[ ${CLEAN_INCLUDE} = "yes" ]]; then
    warn 'Удаляются заголовочные файлы, файлы документации...'
    rm -rf "${WORKDIR}"/root-image/usr/share/doc
    rm -rf "${WORKDIR}"/root-image/usr/src
    find "${WORKDIR}"/root-image/usr/include/ -maxdepth 1 -mindepth 1 -type d | \
        grep -v 'python' | xargs rm -vrf
  fi

  ## ускорим работу с помощью prelink
  #warn 'Prelinking...'
  #if [[ -x "${WORKDIR}/root-image/usr/sbin/prelink" ]] && [[ -r "${WORKDIR}/root-image/etc/prelink.conf" ]]; then
  #  echo -e "\n#Skype not working with prelinking\n-b /usr/bin/skype\n" >> "${WORKDIR}/root-image/etc/prelink.conf" 
  #    echo -e "\n#prelinkin crash with chromium\n-b /usr/lib/chromium/chromium\n" >> "${WORKDIR}/root-image/etc/prelink.conf" 
  #  mkarchroot -r "/usr/sbin/prelink --all" "${WORKDIR}/root-image/"
  #else
  #  echo "No prelink"
  #fi

  #virtualbox ext
  mount -t proc none "${WORKDIR}"/root-image/proc
  mount -t sysfs none "${WORKDIR}"/root-image/sys
  chroot "${WORKDIR}"/root-image VBoxManage extpack install /usr/share/virtualbox/extensions/*.vbox-extpack
  sleep 3
  umount "${WORKDIR}"/root-image/proc
  umount "${WORKDIR}"/root-image/sys
  


  : > "${WORKDIR}"/build.${FUNCNAME}
fi # if [[ ! -e "${WORKDIR}"/build.${FUNCNAME} ]]; then
}

# Build all filesystem images specified in aitab (.fs .fs.sfs .sfs)
make_isoprepare() {
  # подготовим root-image
  customize_root-image
  
  # подготовим загрузчик 
  make_boot
  make_syslinux
  make_isolinux
  
  # завершающие операции
  xorg_drivers
  atlast
  make_aitab

  warn "Сборка ISO-образа. Этап №1..."
  mkarchiso ${VERBOSE} -w "${WORKDIR}" -D "${INSTALL_DIR}" prepare  || die $? 'Ошибка подготовки ISO! Этап prepare'
  mkarchiso ${VERBOSE} -w "${WORKDIR}" -D "${INSTALL_DIR}" checksum || die $? 'Ошибка подготовки ISO! Этап checksum'
}

# Build ISO
# args: $1 (core | netinstall)
make_iso() {
# сначала подготовим директорию с содержимым ISO

make_isoprepare

#local _iso_type=${1}
#local IMGFILE="${PWD}/openarch-`date +%d.%m.%Y`-${_iso_type}-${ARCH}.iso"
local IMGFILE="openarch-`date +%d.%m.%Y`-${ARCH}.iso"

warn 'Создается гибридный ISO диск...'

mkarchiso ${VERBOSE} -o "${PWD}" -w "${WORKDIR}" -D "${INSTALL_DIR}" -L "${ISO_LABEL}" -P 'OvsInc <ovsinc@ya.ru>' -A 'OpenArch Live CD' iso "${IMGFILE}" || \
   die $? 'Ошибка при подготовке ISO образа! Этап №2'

# посчитаем контрольную сумму
pushd "$(dirname "${IMGFILE}")"
warn 'Создается файл с контрольной суммой образа...'
[ -r "${IMGFILE}" ] && md5sum "$(basename ${IMGFILE})" > "${IMGFILE}.md5" || \
 die $? 'Ошибка при подготовке ISO образа! Этап №3'
popd

# установим права доступа 0666 для файла iso
chmod 0666 "${IMGFILE}"
}

cleanexit() {
exit 0
}

make_iso
warn 'Все операции выполнены успешно!!!'


